#!/bin/bash
# tekstilohko on osa tekstiä jota ympäröivät jotkin rajoittimet (tag:it). Esimerkiksi kirjassa on kappaleet ja ne ovat tyhjien rivien ympäröimiä rivijä - tyhjän rivin asemesta voi käyttää mitähyvänsä merkkejä: nettisivuilla on usein: << ja: >> , mutta ihan kivasti sopii myös merkki ** merkitsemään vanhan lopua ja uuden alkua. Mikäli käytetään jotakin merkkiä niin silloin ei merkitse mitään koostuuko teksti riveistä ollenkaan vai onko kaikki yhdessä pötkössä.
# rajoittimet voivat olla tekstiä tai jokin regex 
# kannattaa aina toimia yksinkertaisimmalla tavalla joka toimii.

# BASH:issa rajoittimien ympäröimä teksti erotetaan käskyllä(tässä rajoittimina on: >> ja: <<): 
#   echo 'jotakin roskaa alussa <<...tekstiä ja siinä saa olla välilyöntejäkin...>> jotakin roskaa lopussa' | grep -o '<<.*>>'
# tai toimittaessa tiedostojen kanssa
#   grep '<<.*>>' tiedosto 
# tämä tiedosto-käsky käy automaattisesti läpi koko tiedoston rivi kerrallaan ja soveltaa käskyä siihen.
# jokatapauksessa tämä ottaa mukaan kummankin eroittimen
# mikäli jompaakumpaa eroitinta ei löydy ei myöskään tulosteta mitään.

# Mutta mikäli rajoittimia ei haluta tulosteisiin mukaan niin käsky onkin:
#   echo 'jotakin roskaa alussa <<...tekstiä ja siinä saa olla välilyöntejäkin...>> jotakin roskaa lopussa' | grep -Po '(?<=<<).*(?=>>)'
# tai tiedostolla:
#   grep -Po '(?<=<<).*(?=>>)' tiedosto
# kovien lainausmerkkien välinen teksti tulkitaan aina kirjaimellisesti.
# rajoittimet saavat ola samojakin:
#   grep -Po '(?<=:).*(?=:)' tiedosto        

# mikäli rajoittimien välinen teksti sisältää rivinvaihtoja muuttuu käsky (nyt toimitaan aina tiedostojen kanssa):
#   grep -Poz  '(?ism:BEGIN.*?END)' /boot/grub/grub.cfg
# eroittimet tulevat mukaan. 
# mikäli jompaakumpaa eroitinta ei löydy ei myöskään tulosteta mitään. Tai voi käyttää käskyä: 
#   sed -n '/BEGIN/,/END+/ { p }' /boot/grub/grub.cfg   
# joka tulostaa lohkojen väliin tyhjän rivin
# rivejä ennen ensimmäistä rajoitinta ja viimeisen rajoittimen jälkeen ei tulosteta. Lohkot voi tulostaa näinkin:
#   lspci -v | awk '/VGA/,/^$/'  # lohkon alku on VGA ja loppu tyhjä rivi. Tulostaa muuten jokaisen lohkon joka alkaa VGA
# tuo ^$ merkitsee tyhjää riviä

# lohkoja voikin käsittellä mitenkä hyvänsä jos pystyy pukemaan tehtävän sanoiksi. Näitä tämäntyyppisiä käskyjä on lukemattomia, niiden muodostaminen on hidasta eikä ole mahdollista muistaa niistä montaakaan. Käskyvarasto onkin täysin pakollinen ja täytyy olla jokin keino löytää sieltä haluamansa. Skriptiajuri sopii tähänkin tehävään. Käskyesimerkkejä: 

# 1. Mikäli teksti muodostuu lohkoista niin todennäköisemmin kun halutaan poistaa samanlaiset rivit niin halutaan poistaa toisinnot vain kunkin lohkon sisällä. Siihen sopiva käsky on:
# ensin jaetaan tiedosto ali-tiedostoiksi tyhjien rivien kohdilta: 
#   awk -v RS='' '{ print $0 > "/tmp/delmee"NR }' ~/koe2
#   csplit --suppress-matched -zf /tmp/delmee ~/koe2 /^$/ '{*}' -> tiedostoon /tmp tulee niin monta delmee<00..> tiedostoa kuin tyhjiä rivejä on 
# sitten käsitellään muodostetut ali-tiedostot ja kootaan tulos taas yhteen:
#   echo '' > /tmp/delmee_kokonaisuus; n=1; while true; do [[ -f /tmp/delmee$n ]] && awk '{$1=$1} !x[$0]++' /tmp/delmee$n >> /tmp/delmee_kokonaisuus || exit; ((n++)); done
# - lopputulos on tiedostossa: /tmp/delmee_kokonaisuus

# 2. Kun halutaan tulostaa tiedostosta /boot/grub/grub.cfg ne BEGIN- ja END-rajoittimien väliset lohkot, joiden jollakulla rivillä lukee: source niin käsketään:
#   sed -n '/BEGIN/,/END+/ { p }' /boot/grub/grub.cfg | awk -v RS='' '/source/ {print $0"\n"}'


